home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / bonobo-slay < prev    next >
Text File  |  2006-01-09  |  5KB  |  239 lines

  1. #!/usr/bin/perl
  2. # bonobo-slay
  3. # Kills bonobo processes
  4. #
  5. # Return code of -1 (255) returned if usage error.
  6. # Return code of 1 indicates bonobo processes were running
  7. #   when script was run.  
  8. # Return code of 0 indicates no bonobo processes were
  9. #   running when script was run.
  10. #
  11. use         Getopt::Long;
  12.  
  13. Getopt::Long::Configure( "no_auto_abbrev" );    
  14. Getopt::Long::Configure( "bundling" );
  15.  
  16. $usage_error = 0;
  17. $opt_h = 0, $opt_i = 0, $opt_l = 0, $opt_s = 0; 
  18.  
  19. $rc = GetOptions("help" => \$usage_error, 
  20.          "h"  => \$opt_h, 
  21.          "i"  => \$opt_i, 
  22.          "l"  => \$opt_l, 
  23.          "s"  => \$opt_s);
  24.  
  25. # Usage errors
  26. #
  27. if ($rc != 1) {
  28.    $usage_error = 1;
  29. }
  30.  
  31. if ($opt_l && $opt_s) {
  32.    $usage_error = 1;
  33. }
  34.  
  35. if ($ARGV[0]) {
  36.     $regexp = $ARGV[0];
  37. }
  38.  
  39. # Print usage if necessary.
  40. #
  41. if ($usage_error == 1 || $opt_h) {
  42.     print "\n";
  43.     print "Usage : bonobo-slay [-hls] [regexp]\n";
  44.     print "\tKill Bonobo processes still running.\n";
  45.     print "\t -h,--help Print this help message.\n";
  46.     print "\t -i Ask before killing the processes.\n";
  47.     print "\t -l List processes running, but do not kill them.  Not valid with -s\n";
  48.     print "\t -s Silent.  Kill processes quietly\n";
  49.     print "\t [regexp] only kill proccesses matching this\n";
  50.     print "\n";
  51.     exit(-1);
  52. }
  53.  
  54. # Build ps command.
  55. #
  56. $username = $ENV{USER} || $ENV{LOGNAME} || `logname`;
  57. chomp($username);
  58.  
  59.  $ps_cmd = "/bin/ps -U $username -opid,args";
  60. #   $ps_cmd = "/bin/ps -U $username -xww -opid,command";
  61.  
  62. # get Bonobo files
  63. #
  64. @bonobo_dirs = ( "/usr/lib/bonobo/servers" );
  65. foreach $dir (split(':', $ENV{'BONOBO_ACTIVATION_INFO_PATH'})) {
  66.     if (-d $dir) {
  67.         push @bonobo_dirs, $dir;
  68.     }
  69. }
  70. foreach $dir (split(':', $ENV{'GNOME2_PATH'})) {
  71.     if (-d "$dir/lib/bonobo/servers") {
  72.         push @bonobo_dirs, "$dir/lib/bonobo/servers";
  73.     }
  74. }
  75.  
  76. foreach $dir (@bonobo_dirs) {
  77.     opendir(DIR, $dir) || die "\nCan not open directory $dir\n\t$!\n\n";
  78.     push @bonobo_files, map ("$dir/$_", readdir(DIR));
  79.     closedir DIR;
  80. }
  81.  
  82. # Initialize variables
  83. #
  84. $process_exists = 0;
  85. $first_time     = 1;
  86.  
  87. # Loop until no more processes are found.  This typically loops only once,
  88. # but if an Bonobo process is launched while this script is running an Bonobo
  89. # process can be left behind and be caught on the second loop, etc.
  90. #
  91. do {
  92.     # Initialize variables.
  93.     #
  94.     @files        = @bonobo_files;
  95.     @list_array   = ();
  96.     @process_pids = ();
  97.     @file_process = ();
  98.     $index        = 0;
  99.  
  100.     # Get process list.
  101.     #
  102.     @ps_result    = `$ps_cmd`;
  103.  
  104.     # Loop through files, and see if any Bonobo processes are running.  If
  105.     # so, then build the @list_array and @process_pids arrays.
  106.     # @list_array contains the process names
  107.     # @process_pids contains the process IDs
  108.     #
  109.     while ($fname = shift(@files)) {
  110.  
  111.         if ("$fname" =~ /\.server$/) {
  112.         
  113.             open(FILE, $fname);
  114.             while (<FILE>) {
  115.  
  116.                 $line = $_;
  117.                 if  ($line =~m/location[ \t]*\=/ && 
  118.                    !($line =~m/type=\"shlib\"/)) {
  119.     
  120.                     $line =~s/.*location[ \t]*\="//;
  121.                     $line =~s/".*//;
  122.                     chomp($line);
  123.                     $line =~s/\.\///;
  124.  
  125.                     # bonobo-activation-server needs to be last.
  126.                     #
  127.                     if ($line ne "bonobo-activation-server" and
  128.                         not ($line =~m/^OAFIID:/) and
  129.                         ($regexp and $line =~m/$regexp/) or (not $regexp)) {
  130.                         push @file_process, $line;
  131.                     }
  132.                 } #end while(<FILE>)
  133.             }
  134.             close(FILE);
  135.         }
  136.     }
  137.  
  138.     #   Add bonobo-activation-server so that it is last,
  139.     # but only if we're killing without a regexp
  140.     if (not $regexp) {
  141.          push @file_process, "bonobo-activation-server";
  142.     }
  143.  
  144.     foreach $filep (@file_process) {
  145.  
  146.             # Search through @ps_result and look for matches
  147.             #
  148.             foreach $el (@ps_result) {
  149.                 chomp $el;
  150.             @ps_array = split(' ', $el, 3);
  151.  
  152.             if ($ps_array[1] =~m/(\A|\/)$filep$/ ) {
  153.                     $list_array[$index]=$ps_array[0]."\t".$ps_array[1]."\n";
  154.                     $process_pids[$index]=$ps_array[0]."\n";
  155.                     $index++;
  156.                     }
  157.                 }
  158.             }
  159.  
  160.     # Do the killing.
  161.     #
  162.     if ($#list_array != -1) {
  163.  
  164.         # Print output if -s (silent) argument is not specified.
  165.         #
  166.         if(!$opt_s) {
  167.             if ($first_time == 1) {
  168.                 print "\n";
  169.                 print "The following processes are still running on the system.\n";
  170.  
  171.                 if (!$opt_l) {
  172.                     print "These processes will be terminated.\n";
  173.  
  174.                     print "\n";
  175.                     print "NOTE:  Killing these processes may affect other applications\n";
  176.                     print "on the system that use bonobo.\n"; 
  177.                 }
  178.                 print "\n";
  179.                 $first_time = 0;
  180.             } else {
  181.                 # Just some feedback to indicate it had to loop...
  182.                 #
  183.                 print "...and...\n";
  184.             }
  185.  
  186.             # Print list of processes...
  187.             #
  188.             print @list_array;
  189.             print "\n";
  190.         }
  191.  
  192.         # Kill if the -l argument is not specified.
  193.         #
  194.         if(!$opt_l) {
  195.                 if($opt_i) {
  196.                         print "Do you really want to continue (y/N) ? ";            
  197.                         $_=<STDIN>;
  198.                         chomp;
  199.                         if(not /^[Yy]$/) {
  200.                         exit(-1);
  201.                         }
  202.             }
  203.                         $killall = "/bin/kill";
  204.             $kill_params = ' -9 ';
  205.             foreach $proc (@process_pids) {
  206.                 chomp $proc;
  207.                 if($proc =~m/\d+/) {
  208.                     $cmd = $killall.$kill_params.$proc." 2>/dev/null";
  209.                     system($cmd);
  210.                 }
  211.             }    
  212.         }
  213.         $process_exists = 1;
  214.     }
  215.  
  216. # Only loop once if opt_l is used, otherwise loop until
  217. # no more processes are killed
  218. #
  219. } while ($#list_array != -1 && !opt_l);
  220.  
  221. # Exit
  222. #
  223. if ($process_exists == 0) {
  224.  
  225.     # Show feedback if -l argument is used
  226.     #
  227.     if ($opt_l) {
  228.         print "\n";
  229.         print "No processes.\n";
  230.         print "\n";
  231.     }
  232.     exit 1;
  233. } else {
  234.     exit 0;
  235. }
  236.  
  237.